package me.sdevil507.org.service;

import me.sdevil507.biz.common.exceptions.PhoneNumberExistedException;
import me.sdevil507.org.dto.OrgUserParamsDto;
import me.sdevil507.org.events.OrgUserLastLoginTimeEvent;
import me.sdevil507.org.po.OrgDeptPo;
import me.sdevil507.org.po.OrgUserPo;
import me.sdevil507.supports.jpa.PageParamsDTO;
import me.sdevil507.supports.jpa.SortParamsDTO;
import org.springframework.data.domain.Page;

import java.util.List;
import java.util.Map;

/**
 * Api用户Service
 *
 * @author sdevil507
 * created on 2019/12/15
 */
public interface OrgUserService {

    /**
     * 根据手机号码获取用户信息
     *
     * @param phoneNumber 手机号码
     * @return 用户信息
     */
    OrgUserPo readOneByPhoneNumber(String phoneNumber);

    /**
     * 根据邮箱获取用户信息
     *
     * @param mail 邮箱
     * @return 用户信息
     */
    OrgUserPo readOneByMail(String mail);


    /**
     * 根据手机号码获取用户信息
     *
     * @param id 用户id
     * @return 用户信息
     */
    OrgUserPo readOneById(Long id);

    /**
     * 判断手机号码是否存在
     *
     * @param phoneNumber 手机号码
     * @return 反馈
     */
    boolean existsByPhoneNumber(String phoneNumber);

    /**
     * 根据手机号码更新密码
     *
     * @param newPassword 新密码
     * @param phoneNumber 手机号码
     */
    void updatePasswordByPhoneNumber(String newPassword, String phoneNumber);

    /**
     * 监听用户最后登录时间事件
     *
     * @param event 自定义事件
     */
    void updateLastLoginTime(OrgUserLastLoginTimeEvent event);

    /**
     * 删除用户
     *
     * @param dto 用户dto
     */
    void delete(OrgUserParamsDto dto);

    /**
     * 删除专家
     *
     * @param id 用户id
     */
    void deleteExpertData(Long id);

    /**
     * 删除专家与机构间关系
     *
     * @param id 用户id
     */
    void deleteExpertRel(Long id);

    /**
     * 创建属于机构id下的用户
     *
     * @param dto   用户参数
     * @throws PhoneNumberExistedException PhoneNumberExistedException
     */
    void create(OrgUserParamsDto dto) throws PhoneNumberExistedException;

    /**
     * 更新机构下的用户
     *
     * @param dto   用户参数
     * @throws PhoneNumberExistedException PhoneNumberExistedException
     */
    void update(OrgUserParamsDto dto) throws PhoneNumberExistedException;

    /**
     * 更新个人信息
     * @param dto
     */
    void updateInfo(OrgUserParamsDto dto);

    /**
     * 更新个人信息
     * @param dto
     */
    void updateInfoByPhoneNumber(OrgUserParamsDto dto);

    /**
     * 查询记录列表
     *
     * @param searchParamsDto 查询参数
     * @return 列表
     */
    List<OrgUserPo> readAll(OrgUserParamsDto searchParamsDto);

    /**
     * 分页获取记录
     *
     * @param searchParamsDto 查询DTO
     * @param pageParamsDto   分页DTO
     * @param sortParamsDto   排序DTO
     * @return 分页记录
     */
    Page<OrgUserPo> readAllByPage(OrgUserParamsDto searchParamsDto, PageParamsDTO pageParamsDto, SortParamsDTO sortParamsDto);

    /**
     * 分页获取记录
     *
     * @param searchParamsDto 查询DTO
     * @param pageParamsDto   分页DTO
     * @param sortParamsDto   排序DTO
     * @return 分页记录
     */
    Page<OrgUserPo> readAllExpertInfoByPage(OrgUserParamsDto searchParamsDto, PageParamsDTO pageParamsDto, SortParamsDTO sortParamsDto);

    /**
     * 重置密码
     *
     * @param phoneNumber 用户手机号
     * @param newPassword 密码
     */
    void resetPassword(String phoneNumber, String newPassword);

    /**
     * 绑定手机号码
     *
     * @param id          用户id
     * @param phoneNumber 手机号码
     */
    void bindPhoneNumber(Long id, String phoneNumber) throws PhoneNumberExistedException;

    /**
     * 获取机构下根部门节点
     *
     * @param orgId 机构id
     * @return 根部门节点
     */
    OrgDeptPo readOrgRootDept(Long orgId);

    /**
     * 设置用户与机构和部门关系
     *
     * @param dto 入参
     */
    void setUserRel(OrgUserParamsDto dto);

    /**
     * 获取机构预置的管理员
     *
     * @param orgId 机构id
     * @return 预置管理员
     */
    OrgUserPo getPresetMgr(Long orgId);

    /**
     * 是否包含管理员角色
     *
     * @param id 用户id
     * @return true/false
     */
    boolean containsMgr(Long id);

    /**
     * 是否包含专家角色
     *
     * @param id 用户id
     * @return true/false
     */
    boolean containsExpert(Long id);

    /**
     * 判断是否该机构全职专家
     *
     * @param id 用户id
     * @return true/false
     */
    boolean checkFullTime(Long id, OrgUserParamsDto searchDto);

    /**
     * 判断是否该机构领军任务
     *
     * @param id 用户id
     * @return true/false
     */
    boolean checkLeader(Long id, OrgUserParamsDto searchDto);

    /**
     * 获取该机构下的分析数据
     *
     * @param orgId 组织机构id
     * @return 分析数据
     */
    Map<String, Object> getAnalyze(Long orgId);

    void updateData(OrgUserPo orgUserPo);

    void platCreateOrgUser(OrgUserParamsDto dto) throws PhoneNumberExistedException;

    void platUpdateOrgUser(OrgUserParamsDto dto) throws PhoneNumberExistedException;
}
